package com.yld.scott.ch13;

import static org.junit.Assert.*;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

public class StudentTest {
	
	
	@Test
	public void fs05() throws Exception {
		
		
		// <bean id="student" class="com.yld.scott.ch13.Student" />
		
		String stuStr="com.yld.scott.ch13.Student";
		
		
		//1 搞出大写Class  clazz stu对应的字符串代表的运行时类  javac 字节码文件
		
		Class clazz = Class.forName(stuStr);
		
		//调用newInstance创建类对应的对象 实例    newInstance 调用的是默认的构造方法
		Object stu = clazz.newInstance();
		
		
		//给学生stuName="wc"
		
		//getField getField不能拿到私有的属性
		Field field = clazz.getDeclaredField("stuName");
		
		field.setAccessible(true);
		
		field.set(stu, "wc");
		
		System.out.println(stu);
		
	} 
	@Test
	public void fs04() throws Exception {
		
		
		// <bean id="student" class="com.yld.scott.ch13.Student" />
		
		String stuStr="com.yld.scott.ch13.Student";
		
		
		//1 搞出大写Class  clazz stu对应的字符串代表的运行时类  javac 字节码文件
		
		Class clazz = Class.forName(stuStr);
		
		//调用newInstance创建类对应的对象 实例    newInstance 调用的是默认的构造方法
		Object stu = clazz.newInstance();
		
		//调用setAge方法 把年龄修改为33
		
		Method method = clazz.getMethod("add02", int.class,Integer.class);
		
		Object object = method.invoke(stu, 10,30);
		
		System.out.println(object);
		
	} 
	@Test
	public void fs03() throws Exception {
		
		
		// <bean id="student" class="com.yld.scott.ch13.Student" />
		
		String stuStr="com.yld.scott.ch13.Student";
		
		
		//1 搞出大写Class  clazz stu对应的字符串代表的运行时类  javac 字节码文件
		
		Class clazz = Class.forName(stuStr);
		
		//调用newInstance创建类对应的对象 实例    newInstance 调用的是默认的构造方法
		Object stu = clazz.newInstance();
		
		//调用setAge方法 把年龄修改为33
		
		Method method = clazz.getMethod("setAge", int.class);
		
		method.invoke(stu, 33);
		
		System.out.println(stu);
		
	} 
	@Test
	public void fs02() throws Exception {
		
		
		// <bean id="student" class="com.yld.scott.ch13.Student" />
		
		String stuStr="com.yld.scott.ch13.Student";
		
		
		//1 搞出大写Class  clazz stu对应的字符串代表的运行时类  javac 字节码文件
		
		Class clazz = Class.forName(stuStr);
		
		//调用newInstance创建类对应的对象 实例    newInstance 调用的是默认的构造方法
		Object stu = clazz.newInstance();
		
		System.out.println(stu);
		
		
		//拿到的是自己的方法  不包括父类的方法  包括自己私有方法
		Method[] ms = clazz.getDeclaredMethods();
		
		System.out.println("============");
		for(Method m : ms){
			
			
			System.out.println(m.getName());
			
			//调用add方法?
			
			if("sub".equals(m.getName())){
				
				//对于私有的方法 必须要强制打开访问权限
				
				m.setAccessible(true);
				
				Object result = m.invoke(stu, 20,10);
				
				System.out.println("result="+result);
				
			}
			
			
		}
	} 
	
	
	@Test
	public void fs() throws Exception {
		
		
		// <bean id="student" class="com.yld.scott.ch13.Student" />
		
		String stu="com.yld.scott.ch13.Student";
		
		
		//1 搞出大写Class  clazz stu对应的字符串代表的运行时类  javac 字节码文件
		
		Class clazz = Class.forName(stu);
		
		//调用newInstance创建类对应的对象 实例    newInstance 调用的是默认的构造方法
		Object obj = clazz.newInstance();
		
		System.out.println(obj);
		
		
		//拿到的是自己的方法和父类的方法 不能拿到private
		Method[] ms = clazz.getMethods();
		
		System.out.println("============");
		for(Method m : ms){
			System.out.println(m.getName());
		}
		
		
		
	} 
	

}
